/******************************************************************************/
/* @ All Rights Reserved Copyright (C) 2014 broada,Ltd.                       */
/*                                                                            */
/*  NAME      = informix_core.h                                               */
/*  NOTE      =                                                               */
/*  DATE      = 2015/08/26 by zhengxd                                         */
/******************************************************************************/
#ifndef _INFORMIX_CORE_H_
#define _INFORMIX_CORE_H_

#include "informix_base_type.h"

/*
 *  分片包数据
*/
typedef struct __st_L7_fragment_informix {

    int i_need_req_resp;                   /* 下一个所需数据类型 */
    unsigned ui_parsed_index;              /* 解析到的位置 */
    Frbyte_Packet *p_st_data;              /* packet数据 */
    struct timeval st_first_timestamp;     /* 第一个分片包的时间 */
    struct timeval st_end_timestamp;       /* 最后一个分片包的时间 */
} L7_fragment_informix;

/*
 *   L7session_informix 用于存放informix私有的session数据,
 *   对应L7_session的p_session_private变量
 *   通用的username、dbname、hostname、programname
*/
typedef struct __st_L7session_informix {

    char *p_cli_host_user;                /* 客户端的主机名 */
    char *p_program;                      /* 客户端的程序名 */
    char *p_db_name;                      /* 数据库名 */
    char *p_db_user;                      /* 登陆用户名 */
    int i_endian;                         /* 字节序 */
    int i_flt_type;                       /* 浮点型字节格式 */
    int i_ver_get_flg;                    /* version是否是正确取来的 */
    struct timeval st_login;              /* login成功时刻 */
    unsigned int ui_req_ver_size;
    char *p_req_ver;
    char arr_ver_info[INFORMIX_END_IDX];
} L7session_informix;

/*
 *  informix请求
 *  对应L7_requestdata中的p_request_private数据
*/
typedef struct __st_L7_req_informix {

    int i_req_type;                        /* request类型 */
    int i_login_status;                    /* login状态 */
    int i_statement_type;                  /* statement类型 */
    int i_add_bind_flg;
    int i_new_statement;
    long l_cursor_id;                      /* cursor ID */
    char *p_sql;                           /* sql */
    Sql_statement *p_st_statement;         /* 对应游标数据 */
    Sql_resultset *p_st_resultset;         /* 对应结果集索引 */
} L7_req_informix;

/*
 *  informix响应
 *  解析response过程中的数据
*/
typedef struct __st_L7_resp_informix {

    int i_error_num;                       /* 错误号 */
    int i_statement_type;
    int i_resp_type;                       /* reponse类型 */
    int i_fparam_flg;
    int i_done_flg;
    char *p_error_msg;                     /* 错误信息 */
    unsigned long ui_effect_rows;         /* 影响行数 */
    unsigned long ui_fetch_rows;          /* fetch行数 */
    long l_cursor_id;                      /* cursor ID */
    Frlist_header st_metadata_column;      /* cloum的metadata信息 */
    int arr_ret[6];
}L7_resp_informix;

/*
 *  informix私有数据
*/
typedef struct __st_L7session_informix_private {

    int i_in_session;                      /* session flag */
    L7_fragment_informix *p_st_fragment;   /* 分片包数据 */
    L7session_informix *p_st_sess;         /* session数据 */
    L7_req_informix *p_st_req;             /* request数据 */
    L7_resp_informix *p_st_resp;           /* response信息 */
    Frhash_header *p_hash_prepare;         /* prepare数据(Sql_statement *) */
} L7session_informix_private;

int informix_detect(Conntrack *p_st_conn, Apm_packet *p_st_packet);

int informix_analysis(Conntrack *p_st_conn
                    , Apm_packet *p_st_packet
                    , Frhash_header *p_st_hash_report);

int informix_session_destroy(void *p_private_session);

#endif
